package utils

import (
	"fmt"
	"net/url"

	"github.com/smartwalle/alipay/v3"
	"ttsx/server/common/global"
)

func aliPayPublicInfo(AppId, AppPrivateKey, AliPublicKey, orderId string) (*alipay.Client, error) {
	// 创建客户端
	client, err := alipay.New(AppId, AppPrivateKey, false)
	if err != nil {
		global.App.Log.Sugar().Errorf("创建支付宝支付客户端失败：%s", err.Error())
		return nil, fmt.Errorf("支付失败")
	}

	// 加载aliPay的公钥
	err = client.LoadAliPayPublicKey(AliPublicKey)
	if err != nil {
		global.App.Log.Sugar().Errorf("加载支付宝公钥失败：%s", err.Error())
		return nil, fmt.Errorf("支付失败")
	}
	return client, nil
}

// 统一收单下单并支付页面接口(alipay.trade.page.pay)
func AliTradePagePay(AppId, AppPrivateKey, AliPublicKey, orderId string, totalAmount float64) (aliPayUrl *url.URL, err error) {

	// 初始化client
	client, err := aliPayPublicInfo(AppId, AppPrivateKey, AliPublicKey, orderId)
	if err != nil {
		return nil, fmt.Errorf("支付失败")
	}

	// 构建业务请求的参数
	var p = alipay.TradePagePay{}
	p.OutTradeNo = orderId
	p.TotalAmount = fmt.Sprintf("%.2f", totalAmount)
	p.Subject = fmt.Sprintf("订单支付-%s", orderId)
	p.ProductCode = global.App.Config.AliPay.ProductCode

	// 调用接口
	aliPayUrl, err = client.TradePagePay(p)
	if err != nil {
		global.App.Log.Sugar().Errorf("调用支付宝支付接口失败：%s", err.Error())
		return nil, fmt.Errorf("支付失败")
	}
	global.App.Log.Sugar().Infof("订单:[%s] 调用支付宝支付接口成功", orderId)
	return aliPayUrl, nil
}

// 统一收单交易查询(alipay.trade.query)
func AliTradeQuery(AppId, AppPrivateKey, AliPublicKey, orderId string) (*alipay.TradeQueryRsp, error) {

	// 初始化client
	client, err := aliPayPublicInfo(AppId, AppPrivateKey, AliPublicKey, orderId)
	if err != nil {
		return nil, fmt.Errorf("支付失败")
	}

	// 构建 公共请求参数
	var p = alipay.TradeQuery{}
	p.OutTradeNo = orderId

	// 调用接口
	ret, err := client.TradeQuery(p)
	if err != nil {
		global.App.Log.Sugar().Errorf("调用支付宝支付接口失败：%s", err.Error())
		return nil, fmt.Errorf("支付失败")
	}

	global.App.Log.Sugar().Infof("订单:[%s] 调用支付宝支付查询接口成功", orderId)
	return ret, nil
}
